funccircleArea(radius float64)(float64, error) { if radius < 0 { return0, fmt.Errorf("Area calculation failed, radius %0.2f is less than zero", radius) } return math.Pi * radius * radius, nil }
funcmain() { radius := -20.0 area, err := circleArea(radius) if err != nil { fmt.Println(err) return } fmt.Printf("Area of circle %0.2f", area) }
在上面的程序中,我们使用 Errorf(第 10 行)打印了发生错误的半径。程序运行后会输出:
1
Area calculation failed, radius -20.00 is less than zero
使用结构体类型和字段提供错误的更多信息
错误还可以用实现了 error [接口]的结构体来表示。这种方式可以更加灵活地处理错误。在上面例子中,如果我们希望访问引发错误的半径,现在唯一的方法就是解析错误的描述信息 Area calculation failed, radius -20.00 is less than zero。这样做不太好,因为一旦描述信息发生变化,程序就会出错。
funcmain() { radius := -20.0 area, err := circleArea(radius) if err != nil { if err, ok := err.(*areaError); ok { fmt.Printf("Radius %0.2f is less than zero", err.radius) return } fmt.Println(err) return } fmt.Printf("Area of rectangle1 %0.2f", area) }
funcmain() { length, width := -5.0, -9.0 area, err := rectArea(length, width) if err != nil { if err, ok := err.(*areaError); ok { if err.lengthNegative() { fmt.Printf("error: length %0.2f is less than zero\n", err.length)
} if err.widthNegative() { fmt.Printf("error: width %0.2f is less than zero\n", err.width)
funcrectArea(length, width float64)(float64, error) { err := "" if length < 0 { err += "length is less than zero" } if width < 0 { if err == "" { err = "width is less than zero" } else { err += ", width is less than zero" } } if err != "" { return0, &areaError{err, length, width} } return length * width, nil }
funcmain() { length, width := -5.0, -9.0 area, err := rectArea(length, width) if err != nil { if err, ok := err.(*areaError); ok { if err.lengthNegative() { fmt.Printf("error: length %0.2f is less than zero\n", err.length)
} if err.widthNegative() { fmt.Printf("error: width %0.2f is less than zero\n", err.width)